//
//  Header.h
//  BLEDemo
//
//  Created by hle1 on 2021/4/30.
//

#ifndef HLELowcostPeripherialHeader_h
#define HLELowcostPeripherialHeader_h



#define CONF_PAYLOAD_WIDTH 20            //广播包有效数据长度

#define PRO_BLUETOOTH_TAPE_LIGHT_DEFAULT_NAME    @"BTL-PRO"

#define PRO_BLUETOOTH_TAPE_LIGHT_DEFAULT_NAME_Iphone    @"BTL-PRO-iPhone"



#define PRO_BLUETOOTH_TAPE_LIGHT_HEADER_MAGIC    (0xFBFBFB)    //MINI/PRO蓝牙灯带（PAN2013）协议交互命令头标志

#define MINI_BLUETOOTH_TAPE_LIGHT_HEADER_RX    {0xFB, 0xFB, 0xFB}    //MINI蓝牙灯带（PAN2013）协议交互命令头标志
#define MINI_BLUETOOTH_TAPE_LIGHT_RX_ADDR    {0xCC, 0xCC, 0xCC}

//命令号，枚举定义
typedef enum
{
    //APP广播扫描包，扫描周围设备，获取设备类型（依据命令头的head字段确定）+设备名称+滚码ID）
    //CMD_SCAN_DEV_REQ = 0x02,                    //扫描设备--请求
    //CMD_SCAN_DEV_ECHO = 0x03,                    //扫描设备--回应
    //获取到设备类型+设备名称+滚码ID后,APP可显示成功连接设备（假连接）
    
//    CMD_SET_DEV_NAME_REQ =0x04,                    //设置设备名称--请求
//    CMD_SET_DEV_NAME_ECHO = 0x05,                //设置设备名称--回应
    
//    CMD_SET_DEV_GROUP_ID_REQ = 0x06,            //设置设备所属组ID--请求
//    CMD_SET_DEV_GROUP_ID_ECHO = 0x07,            //设置设备所属组ID--回应
    
//    CMD_GET_DEV_GROUP_ID_REQ = 0x08,            //获取设备所属组ID--请求
//    CMD_GET_DEV_GROUP_ID_ECHO = 0x09,            //获取设备组所属ID--回应
        
    CMD_SET_DEV_MODE_REQ     = 0x0A,                //设置单台/组设备亮灯模式--请求
    CMD_SET_DEV_MODE_ECHO = 0x0B,                //设置单台/组设备亮灯模式--回应

    CMD_SET_DEV_MODE_APPEND_REQ = 0x0C,            //设置单台/组设备亮灯模式附加数据项--请求
    CMD_SET_DEV_MODE_APPEND_ECHO = 0x0D,        //设置单台/组设备亮灯模式附加数据项--回应

    
    CMD_SET_DEV_COUNT_DOWN_REQ = 0x0E,            //设置单台/组设备倒计时任务--请求
    CMD_SET_DEV_COUNT_DOWN_ECHO = 0x0F,            //设置单台/组设备带倒计时任务--回应

    CMD_GET_DEV_COUNT_DOWN_REQ = 0x10,            //获取单台/组设备倒计时任务--请求
    CMD_GET_DEV_COUNT_DOWN_ECHO = 0x11,            //获取单台/组设备倒计时任务--回应

    CMD_SET_DEV_TIMING_REQ = 0x12,                //设置设备定时任务--请求
    CMD_SET_DEV_TIMING_ECHO = 0x13,            //设置设备定时任务--回应

    CMD_GET_DEV_TIMING_REQ = 0x14,                //获取设备定时任务--请求
    CMD_GET_DEV_TIMING_ECHO = 0x15,            //获取设备定时任务--回应
    
//    CMD_DISSOLVE_DEV_GROUP_REQ = 0x16,            //解散设备组--请求
//    CMD_DISSOLVE_DEV_GROUP_ECHO = 0x17,            //解散设备组--回应

    CMD_SET_DEV_TIME_REQ = 0x18,                //设置单台/组设备系统时间--请求
    CMD_SET_DEV_TIME_ECHO = 0x19,                //设置单台/组设备系统时间--回应
    
    CMD_SET_BIND_REQ = 0x1a,
    CMD_SET_BIND_ECHO = 0x1b,

    CMD_SET_MARQUEE_CFG_REQ = 0x1c,
    CMD_SET_MARQUEE_CFG_ECHO = 0x1d,

    CMD_SET_OPEN_LIGHT_STATU_REQ = 0xA0,        //设置开灯状态
    CMD_SET_OPEN_LIGHT_STATU_ECHO = 0xA1
,

    //获取灯模式相关
    CMD_GET_DEV_MODE_REQ = 0xA2,                //获取灯模式接口--请求
    CMD_GET_DEV_MODE_ECHO = 0xA3,                //获取灯模式接口--回应（设备端不接收）
    CMD_GET_DEV_MODE_APPEND_REQ = 0xA4,            //获取单台/组设备亮灯模式附加数据项--请求(实际上APP不需要发该条请求)
    CMD_GET_DEV_MODE_APPEND_ECHO = 0xA5,        //获取单台/组设备亮灯模式附加数据项--回应（设备端不接收）

    //获取开灯状态
    CMD_GET_OPEN_LIGHT_STATU_REQ = 0xA6,        //获取开灯状态--请求
    CMD_GET_OPEN_LIGHT_STATU_ECHO = 0xA7,        //获取开灯状态--回应
    
    //
    CMD_START_TEST_REQ = 0xa8,        // 滚码设为全FF
    CMD_SET_PWM_REQ = 0xa9,            // 滚码设为全FF
    
    CMD_LIGHT_STATUS_REQ = 0xaa,
    CMD_LIGHT_STATUS_NOTIFY = 0xab,
    
}E_CMD_TYPE_HLELowcostPeripherial;


//场景ID(低4bit)
typedef enum{
    //注意：以下开关灯场景命令，设备端不会解析命令携带的数据
    SCENE_ID_TURN_OFF     = 0x0,    //关闭灯带（此时模式ID的4bit无效）
    SCENE_ID_TURN_ON     = 0x1,    //打开灯带（此时模式ID的4bit无效）
    
    SCENE_ID_COMMON     = 0x2,     //普通场景(自定义)
    
    //注意：以下固定场景命令，设备端不会解析命令携带的数据
    SCENE_ID_COLORFUL     = 0x3,    //缤纷（此时模式ID的4bit无效）
    SCENE_ID_GORGEOUS     = 0x4,    //斑斓（此时模式ID的4bit无效）
    SCENE_ID_HAPPY         = 0x5,    //欢乐（此时模式ID的4bit无效）
    SCENE_ID_ROMATIC     = 0x6,    //浪漫（此时模式ID的4bit无效）
    SCENE_ID_PARTY         = 0x7,    //聚会（此时模式ID的4bit无效）
    SCENE_ID_WORK        = 0x8,    //工作
    SCENE_ID_GOODNIGHT    = 0x9,    //晚安

    //注意：内置律动场景命令，设备端仅仅会解析RGB切换方式（RGB_sw_mode）
    SCENE_ID_INNER         = 0x0A,    //内置律动（此时模式ID的4bit无效）
    SCENE_ID_OUTER         = 0x0B,    //外置律动（此时模式ID的4bit无效）

    /*使用额外的固定场景ID，(模式ID固定传0x1，即动态)
        1.切换方式请携带在灯模式控制命令中的RGB_sw_mode字段，参考E_RGB_SWITCH_TYPE
        2.颜色ID携带在灯模式控制命令中的 extra_scene_id 字段，参考 E_EXTRA_SCENE_TYPE
    */
    SCENE_ID_EXTRA        = 0x0C,

    SCENE_ID_READ        = 0x0D,    //阅读
    
}E_TAPE_LIGHT_SCENE_ID_HLELowcostPeripherial;
    
//模式ID(高4bit)
typedef enum{
    MODE_ID_DYNAMOC = 0x1,    //动态
    MODE_ID_RGB = 0x2,        //RGB
    MODE_ID_CW_CCT = 0x3,        //CW控制
    MODE_ID_MARQUEE = 0x4,    //幻彩
}E_TAPE_LIGHT_MODE_ID_HLELowcostPeripherial;

//RGB颜色切换方式：1：流光；2：闪光；3：跳跃；4：频闪；5：渐变； 6：呼吸
typedef enum{
    
    RGB_FLOWING_MODE = 0x1,        //流光
    RGB_FLASH_MODE = 0x2,        //闪光
    RGB_JUMP_MODE = 0x3,        //跳跃
    RGB_STROBOFLASH_MODE = 0x4, //频闪
    RGB_GRADUAL_MODE = 0x5,    //渐变(同流光)
    RGB_BREATH_MODE = 0x6,        //呼吸
    
    MARQUEE_RIGHT_CYCLE = 0x7,
    MARQUEE_RIGHT_SINGLE_CYCLE = 0x8,
    MARQUEE_RIGHT_SINGLE = 0x9,
    MARQUEE_RIGHT_LEFT_ZONE = 0xa,
    MARQUEE_ZONE_TOCENTER_SINGLE = 0xb,
    MARQUEE_RIGHT_SINGLE_KEEP = 0xc,
}E_RGB_SWITCH_TYPE_HLELowcostPeripherial;

//额外的固定场景颜色ID值
typedef enum{
    SCENE_ID_SEVEN    = 0x01,     //七彩
    SCENE_ID_RED    = 0x02,     //红色(不支持流光)
    SCENE_ID_GREEN    = 0x03,     //绿色(不支持流光)
    SCENE_ID_BLUE    = 0x04,     //蓝色(不支持流光)
    SCENE_ID_YELLOW = 0x05,     //黄色(不支持流光)
    SCENE_ID_CYAN    = 0x06,     //青色(不支持流光)
    SCENE_ID_PURPLE = 0x07,     //紫色(不支持流光)
    SCENE_ID_WHITE = 0x08,        //白色(不支持流光)
    SCENE_ID_RED_GREEN = 0x09,    //红<-->绿
    SCENE_ID_RED_BLUE = 0x0A,    //红<-->蓝
    SCENE_ID_GREEN_BLUE = 0x0B, //绿<-->蓝

    MARQUEE_COLOR_ID1 = 0x0c,
    MARQUEE_COLOR_ID2 = 0x0d,
    MARQUEE_COLOR_ID3 = 0x0e,
    MARQUEE_COLOR_ID4 = 0x0f,
    MARQUEE_COLOR_ID5 = 0x10,
    MARQUEE_COLOR_ID6 = 0x11,
    MARQUEE_COLOR_ID7 = 0x12,
    MARQUEE_COLOR_ID8 = 0x13,
    MARQUEE_COLOR_ID9 = 0x14,
}E_EXTRA_SCENE_TYPE_HLELowcostPeripherial;


#define HLE_BIND_MAGIC        0x21754d43
#define HLE_RESET_MAGIC        0x25793865
typedef struct _dev_base_para_t
{
    uint32_t bindMagic;
    uint16_t marqueeNode;
    //unsigned char dev_name[8];
    //unsigned char dev_group_id[2];//设备所属组ID
    //设备滚码(默认覆盖MAC地址的后4个字节，0x33,0x44,0x55,0x66)
    unsigned char dev_rolling_code[4];//= {0x33,0x44,0x55,0x66};会替换成MAC地址的后4个字节
    unsigned char rgbSeq;    // 0-rgb, 1-rbg, 2-grb, 3-gbr, 4-brg, 5-bgr
    unsigned char protocol;    //
    
    //unsigned char sn[17];
    //unsigned char lightType;    // bit0: 1-ct, 0-no ct; bit1: 1-rgb, 0-norgb; bit2: 1-single white, 0-cw; bit3: 1-no mic, 0-mic; bit4: 1-marquee4
}dev_base_para_t;

typedef struct
{
    unsigned char sn[17];
    unsigned char lightType;
} HLE_DEVINFO_S;

typedef struct _dev_open_light_statu_t
{
    unsigned char    mode;                    //模式:0=上次色温；1-默认色温 2-上次RGB模式 3-默认rgb
    
    /*----#默认状态----------------------------------------------------------------------------*/
    unsigned char     default_RGB[3];            //默认RGB颜色值
    unsigned char     default_cw_cct;            //CW 控制---色温
    unsigned char     default_cw_lum;            //CW 控制---亮度
    unsigned char      reserved[2];
    /*----#上一次开灯状态----------------------------------------------------------------------------*/
    /*
        1.若断电前为色温状态：灯亮度小于30%，上电会自动将亮度调节为30%
        2.若断电前为RGB状态：上电会自动将亮度调节为100%
    */
    
}dev_open_light_statu_t; //8 Bytes

typedef struct _dev_rgb_mode_t
{
    dev_open_light_statu_t open_status;        //开灯状态参数
    //8 Bytes
    
    unsigned char   scene_mode_id;            /*场景id+模式ID，
                                                bit0-bit3:场景ID(0~10),参考 E_TAPE_LIGHT_SCENE_ID
                                                bit4-bit7:模式ID(0~3),参考 E_TAPE_LIGHT_MODE_ID
                                            */
    unsigned char     dev_RGB_brightness ;//= 10; //RGB灯的亮度[0,100]
    unsigned short     dev_RGB_speed ;//= 2000;    //单位：ms, RGB灯颜色变化速度,流光和跳跃是[500,50000]  闪光是[100,10000]
    //12 Bytes
    //二维数组元素0:R/1:G/2:B。仅 RHYTHMIC_MODE_OUTER（外置律动）+ RGB_MODE_COMMON 灯模式下有效
    unsigned char     dev_RGB_value[7][3]; //注意里边的值统一存储成[0,255]的值

    unsigned char     switching_mode;        //切换方式,参考 E_RGB_SWITCH_TYPE（1：流光；2：闪光；3：跳跃；4：频闪；5：渐变； 6：呼吸）
    unsigned char     cw_lum;                //CW 控制---亮度
    unsigned char     cw_cct;
    //36 Bytes
    //unsigned char     reserved1[4];
    /*----#上一次的亮灯模式数据，备份----------------------------------------------------------------------------*/
    unsigned char     last_scene_mode_id;    //关灯前最后一次的场景模式（排除关灯场景）
    unsigned char     last_dev_RGB_brightness ;
    unsigned short    last_dev_RGB_speed ;
    unsigned char     last_dev_RGB_value[7][3];
    unsigned char     last_switching_mode;
    unsigned char     last_cw_lum;
    unsigned char     last_cw_cct;
    //unsigned char     reserved3[4];
    //64 Bytes
    unsigned char     rmt_scene_mode_id;    //关灯前最后一次的场景模式（排除关灯场景）
    unsigned char     rmt_dev_RGB_brightness ;
    unsigned short    rmt_dev_RGB_speed ;
    unsigned char     rmt_dev_RGB_value[7][3];
    unsigned char     rmt_switching_mode;
    unsigned char     rmt_cw_lum;
    unsigned char     rmt_cw_cct;
    //92 bytes
}dev_rgb_mode_t;//72字节


typedef struct
{
    unsigned char    combined_var;    /*组合变量，bit0~3:定时任务task ID[0x1,0x5];
                                    bit4:保留；
                                    bit5:保留;
                                    bit6:当前定时任务是否（1/0）正在执行中(APP端下发时置零),用于获取设备定时任务状态;
                                    bit7:当前任务是（1/0）否有效
                                    */
    unsigned char    mode;            //要执行的操作，支持部分场景ID：参考   E_TAPE_LIGHT_SCENE_ID
    unsigned char     repeat;            /*8位二进制里面每一位表示星期x ，从低位到高位，分别表示周日到周六；
                                     对应位置1表示重复 ，最高位置1表示仅一次
                                     如：repeat值为7表示二进制 00000111, 即周日、一、二重复。*/
    signed     char     action;            //最新执行的操作：1:新增;2：修改；3：删除（便于APP获取状态）
    unsigned short     start_s;        //开始时间(一天当中的时间戳，[0,1440]单位：分)
    unsigned short     end_s;            //结束时间(一天当中的时间戳，[0,1440]单位：分)

}RGBTimer_t; //8字节

typedef struct
{
    unsigned int     count_down_time;        //倒计时时间,发UNIX时间戳（秒级），关闭直接发0，即为立即关闭 （大端传输）
    unsigned char    action;                    //倒计时时间结束后要执行的动作（0：关；1：开）
    unsigned char     reserved[3];
} RGBCount_down_t;//8字节




/*-----------------------------------------------------------------------
所有命令都统一20字节长度,且格式为 cmd header(4Bytes) + data(16Bytes)格式。
------------------------------------------------------------------------*/

//命令 header
typedef struct _CMD_HEADER
{
    unsigned char    head[3];                //命令头标志，统一填充 MINI_BLUETOOTH_TAPE_LIGHT_HEADER_MAGIC;
    unsigned char    command;                //参考 E_CMD_TYPE
}S_CMD_HEADER; //4字节


/*---扫描设备 命令(CMD_SCAN_DEV_REQ)----------------------------------------------------------*/
typedef struct _CMD_SCAN_DEV_REQ
{
    S_CMD_HEADER     header;
    unsigned char     reserved[16];
}S_CMD_SCAN_DEV_REQ;//20字节


typedef struct _CMD_CMD_SCAN_DEV_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned char     dev_name[12];            //设备名称
}S_CMD_SCAN_DEV_ECHO;//20字节

/*---设置设备名称 命令(CMD_SET_DEV_NAME_REQ)(预留)----------------------------------------------------------*/
typedef struct _CMD_SET_DEV_NAME_REQ
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned char     dev_name[12];            //设备名称
}S_CMD_SET_DEV_NAME_REQ;//20字节


typedef struct _CMD_SET_DEV_NAME_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned char    result;                    //结果：0：成功；-1：失败
    unsigned char     reserved[7];
}S_CMD_SET_DEV_NAME_ECHO;//20字节

/*---设置设备所属组ID 命令(CMD_SET_DEV_GROUP_ID_REQ)----------------------------------------------------------*/
typedef struct _CMD_SET_DEV_GROUP_ID_REQ
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short     group_id;                //设备组ID （大端传输）
    unsigned char     reserved[10];
}S_CMD_SET_DEV_GROUP_ID_REQ;//20字节

typedef struct _CMD_SET_DEV_GROUP_ID_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    char             result;                    //结果：0：成功；-1：失败
    unsigned char     reserved[11];
}S_CMD_SET_DEV_GROUP_ID_ECHO;//20字节

/*---获取设备所属组ID 命令(CMD_GET_DEV_GROUP_ID_REQ)----------------------------------------------------------*/
typedef struct _CMD_GET_DEV_GROUP_ID_REQ
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned char     reserved[12];
}S_CMD_GET_DEV_GROUP_ID_REQ;//20字节

typedef struct _CMD_GET_DEV_GROUP_ID_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short     group_id;                //设备组ID （大端传输）
    unsigned char     reserved[10];
}S_CMD_GET_DEV_GROUP_ID_ECHO;//20字节

/*---解散分组------------------------------------------------------------------*/
typedef struct _CMD_DISSOLVE_DEV_GROUP_REQ
{
    S_CMD_HEADER     header;
    unsigned short     group_id;                //设备组ID （大端传输）
    unsigned char     reserved[14];
}S_CMD_DISSOLVE_DEV_GROUP_REQ;//20字节

typedef struct _CMD_DISSOLVE_DEV_GROUP_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short     group_id;                //设备组ID （大端传输）
    char            result;                    //0：成功 ； -1：失败
    unsigned char     reserved[9];
}S_CMD_DISSOLVE_DEV_GROUP_ECHO;//20字节


/*---设置单台/组设备亮灯模式 命令( CMD_SET_DEV_MODE_REQ )---------------------------------------------------------------------*/
typedef struct _CMD_SET_DEV_MODE_REQ
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short    group_id;                //设备组ID （大端传输）
    unsigned char   scene_mode_id;            /*场景id+模式ID，
                                                bit0-bit3:场景ID(0~10),参考 E_TAPE_LIGHT_SCENE_ID
                                                bit4-bit7:模式ID(0~3),参考 E_TAPE_LIGHT_MODE_ID
                                            */
    //以上11字节
    
    //----#“动态+RGB+CCT”模式参数----------------------------------------------------------------------------
    unsigned char    RGB_brightness;            //RGB灯珠亮度值[0,100]
    unsigned short     RGB_speed;                //RGB灯珠颜色切换速度值,大端格式(ms)：流光和跳跃是[500,50000] ; 闪光是[100,10000]
    unsigned char    RGB_sw_mode;            //RGB颜色切换方式，参考 E_RGB_SWITCH_TYPE（1：流光；2：闪光；3：跳跃；4：频闪；5：渐变； 6：呼吸）
    unsigned char    append_flag;            //标记是否（1/0）有附加包
    unsigned char    RGB_value0[3];            /*A:RGB控制时(可能有附加包)：
                                                数组元素0-R/1-G/-B。全0代表使用默认亮灯模式。
                                              B:CW控制时（无附加包）:
                                                RGB_value0[0]:保存亮度（lum）值[0,100];
                                                RGB_value0[2~3]:保存色温（cct）值[3000K,6000K]（大端传输）*/
    
    
    unsigned char     extra_scene_id;        //额外的固定场景的颜色ID值，仅额外的固定场景使用，参考 E_EXTRA_SCENE_TYPE
    
}S_CMD_SET_DEV_MODE_REQ;//20字


typedef struct _CMD_SET_DEV_MODE_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    char             result;                    //操作结果：成功：0；失败：-1
    unsigned char    reserved[11];
}S_CMD_SET_DEV_MODE_ECHO;//20字节

//附加包 对应命令：CMD_SET_DEV_MODE_APPEND_REQ
typedef struct _CMD_SET_DEV_MODE_APPEND_REQ
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short    group_id;                //设备组ID （大端传输）
    unsigned char    total_package;            //附加包总共的广播包数
    unsigned char    curr_package_index;        //附加包当前包的序号[1,total_package]
    
    unsigned char    RGB_value1[3];            //7个RGB值,第1/3/5个的RGB值
    unsigned char    RGB_value2[3];            //7个RGB值,第2/4/6个的RGB值
    unsigned char    reserved[2];
}S_CMD_SET_DEV_MODE_APPEND_REQ; //20字节

typedef struct _CMD_SET_DEV_MODE_APPEND_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    char             result;                    //操作结果：成功：0；失败：-1
    unsigned char    reserved[11];
}S_CMD_SET_DEV_MODE_APPEND_ECHO;//20字节

/*----#获取灯模式参数----------------------------------------------------------------------------*/
//cmd = CMD_GET_DEV_MODE_REQ
typedef struct _CMD_GET_DEV_MODE_REQ
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short    group_id;                //设备组ID （大端传输）
    unsigned char    reserved[10];
    
}S_CMD_GET_DEV_MODE_REQ;

typedef struct _CMD_GET_DEV_MODE_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    //unsigned short    group_id;            //设备组ID （大端传输）不需要
    unsigned char    reserved[2];
    unsigned char   scene_mode_id;            /*场景id+模式ID，
                                                bit0-bit3:场景ID(0~10),参考 E_TAPE_LIGHT_SCENE_ID
                                                bit4-bit7:模式ID(0~3),参考 E_TAPE_LIGHT_MODE_ID
                                            */
    //以上11字节
    
    //----#“动态+RGB+CCT”模式参数----------------------------------------------------------------------------
    unsigned char    RGB_brightness;            //RGB灯珠亮度值[0,100]
    unsigned short     RGB_speed;                //RGB灯珠颜色切换速度值(ms)：流光和跳跃是[500,50000] ; 闪光是[100,10000]
    unsigned char    RGB_sw_mode;            //RGB颜色切换方式（1：流光；2：闪光；3：跳跃；4：频闪；5：渐变； 6：呼吸）
    unsigned char    append_flag;            //标记是否（1/0）有附加包
    unsigned char    RGB_value0[3];            /*A:RGB控制时(可能有附加包)：
                                                数组元素0-R/1-G/-B。全0代表使用默认亮灯模式。
                                              B:CW控制时（无附加包）:
                                                RGB_value0[0]:保存亮度（lum）值[0,100];
                                                RGB_value0[2~3]:保存色温（cct）值[3000K,6000K]（大端传输）*/
    
    
    unsigned char     open_or_close;            //当前灯是关闭还是打开状态(0:关闭；1：开)
    

}S_CMD_GET_DEV_MODE_ECHO;

//附加包 对应命令：CMD_GET_DEV_MODE_APPEND_REQ (实际上APP不需要发该条请求)
//typedef struct _CMD_GET_DEV_MODE_APPEND_REQ
//{
//    S_CMD_HEADER     header;
//    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
//    unsigned short    group_id;                //设备组ID （大端传输）
//    unsigned char    reserved[10];
//}S_CMD_GET_DEV_MODE_APPEND_REQ;

//由 S_CMD_GET_DEV_MODE_ECHO 自动触发
typedef struct _CMD_GET_DEV_MODE_APPEND_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    //unsigned short    group_id;                //设备组ID （大端传输）
    unsigned char     reserved0[2];
    unsigned char    total_package;            //附加包总共的广播包数
    unsigned char    curr_package_index;        //附加包当前包的序号[1,total_package]
    
    unsigned char    RGB_value1[3];            //7个RGB值,第1/3/5个的RGB值
    unsigned char    RGB_value2[3];            //7个RGB值,第2/4/6个的RGB值
    unsigned char    reserved1[2];
}S_CMD_GET_DEV_MODE_APPEND_ECHO;


/*---设置单台/组设备倒计时任务 命令(CMD_SET_DEV_COUNT_DOWN_REQ)------------------------------------------------------------------------*/
typedef struct _CMD_SET_DEV_COUNT_DOWN_REQ
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short    group_id;                //设备组ID （大端传输）
    unsigned char    reserved1[2];
    RGBCount_down_t    task;
}S_CMD_SET_DEV_COUNT_DOWN_REQ;//20字节

typedef struct _CMD_SET_DEV_COUNT_DOWN_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    char             result;                    //操作结果：成功：0；失败：-1
    unsigned char    reserved[3];
    RGBCount_down_t task;
}S_CMD_SET_DEV_COUNT_DOWN_ECHO;//20字节

/*----#获取单台/组设备倒计时任务 命令(CMD_GET_DEV_COUNT_DOWN_REQ)----------------------------------------------------------------------------*/
typedef struct _CMD_GET_DEV_COUNT_DOWN_REQ
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short    group_id;                //设备组ID （大端传输）
    unsigned char    reserved1[2];
    unsigned char    reserved2[8];
}S_CMD_GET_DEV_COUNT_DOWN_REQ;//20字节

typedef struct _CMD_GET_DEV_COUNT_DOWN_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    RGBCount_down_t    task;
    unsigned char    reserved[4];
}S_CMD_GET_DEV_COUNT_DOWN_ECHO;//20字节



/*----#设置单台/组设备定时任务命令（CMD_SET_DEV_TIMING_REQ）----------------------------------------------------------------------------*/
typedef struct _CMD_SET_DEV_TIMING_REQ
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short    group_id;                //设备组ID （大端传输）
    //unsigned char    total_package;            //总包数（2）
    //unsigned char    cur_package_index;        //[1,2]
    unsigned char reserved[2];
    /*---任务数据---------------------------*/
    //unsigned char    RGBTimer_data[8];        // RGBTimer_t 字节数据分两次拷贝到该数组发出
    RGBTimer_t tmr;
}S_CMD_SET_DEV_TIMING_REQ; //20字节

typedef struct _CMD_SET_DEV_TIMING_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    char             result;                    //结果：0：成功；-1：失败
    unsigned char    action;                    //    RGBTimer_t 中的字段
    unsigned char    combined_var;            //    RGBTimer_t 中的字段
    unsigned char     reserved[1];
    RGBTimer_t tmr;
}S_CMD_SET_DEV_TIMING_ECHO;//20字节

/*----#获取单台/组设备定时任务( CMD_GET_DEV_TIMING_REQ )----------------------------------------------------------------------------*/
typedef struct _CMD_GET_DEV_TIMING_REQ
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short    group_id;                //设备组ID （大端传输）
    unsigned char    reserved1[2];
    unsigned char     reserved2[8];
}S_CMD_GET_DEV_TIMING_REQ; //20字节

//该返回值APP连续收到几个，就代表有几个定时任务
typedef struct _CMD_GET_DEV_TIMING_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned char    total_package;            //总包数n
    unsigned char    cur_package_index;        //当前包序号[1,n]
    //unsigned char    valid_bytes;            //timing_task数组有效的字节数[1,9]
    unsigned char    reserved[2];
    //unsigned char    timing_task[9];            //存放 RGBTimer_t 结构转存的字节数组
    RGBTimer_t        tmr;
}S_CMD_GET_DEV_TIMING_ECHO;//20字节

/*----#设置系统时间 CMD_SET_DEV_TIME_REQ ----------------------------------------------------------------------------*/
typedef struct _CMD_SET_DEV_TIME_REQ //作为系统校时用
{
    S_CMD_HEADER    header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short    group_id;                //设备组ID （大端传输）
    unsigned char    reserved0[2];
    unsigned int     timestamp;                //当前手机的时间戳（精确到s）
    unsigned char     reserved1[4];
}S_CMD_SET_DEV_TIME_REQ;//20字节

typedef struct _CMD_SET_DEV_TIME_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    char             result;                    //结果：0：成功；-1：失败
    unsigned char     reserved[11];
}S_CMD_SET_DEV_TIME_ECHO;//20字节



/*----#设置开灯状态----------------------------------------------------------------------------*/
typedef struct _CMD_SET_OPEN_LIGHT_STATU_REQ
{
    S_CMD_HEADER    header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short    group_id;                //设备组ID （大端传输）
    dev_open_light_statu_t    status;            //开灯模式参数

}S_SET_OPEN_LIGHT_STATU_REQ;//20字节

typedef struct _CMD_SET_OPEN_LIGHT_STATU_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    char             result;                    //结果：0：成功；-1：失败
    unsigned char     reserved[11];
}S_SET_OPEN_LIGHT_STATU_ECHO;//20字节

/*----#CMD_GET_OPEN_LIGHT_STATU_REQ----------------------------------------------------------------------------*/
//获取开灯状态
typedef struct _CMD_GET_OPEN_LIGHT_STATU_REQ
{
    S_CMD_HEADER    header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    unsigned short    group_id;                //设备组ID （大端传输）
    unsigned char   reserved[10];
    
}S_GET_OPEN_LIGHT_STATU_REQ;//20字节

typedef struct _CMD_GET_OPEN_LIGHT_STATU_ECHO
{
    S_CMD_HEADER     header;
    unsigned char    dev_rolling_code[4];     //设备的唯一识别码（烧录时的滚码，大端传输）
    dev_open_light_statu_t    status;            //开灯模式参数
    char             result;                    //结果：0：成功；-1：失败
    unsigned char     reserved[3];
}S_GET_OPEN_LIGHT_STATU_ECHO;//20字节


typedef struct {
    S_CMD_HEADER header;
    uint8_t dev_rolling_code[4];
    uint8_t reserved[12];
} S_START_TEST_REQ;

typedef struct {
    S_CMD_HEADER header;
    uint8_t dev_rolling_code[4];
    uint8_t red;    // 0-255
    uint8_t green;    // 0-255
    uint8_t blue;    // 0-255
    uint8_t warm;    // 0-100
    uint8_t cool;    // 0-100
    uint8_t reserved[7];
} S_SET_PWM_REQ;


typedef struct {
    S_CMD_HEADER header;
    uint8_t dvc[4];        // 绑定命令时设为0xff 0xff 0xff 0xff, 复位命令用绑定时指定的码
    uint8_t magic[4];    // 绑定命令 0x43 0x4d 0x75 0x21，复位命令 0x65 0x38 0x79 0x25
    uint8_t nrc[4];        // 绑定命令时设置的新滚码，其它命令均应使用这个滚码，复位命令此字段忽略
    uint8_t reserved[4];
} S_SET_BIND_REQ;

typedef struct {
    S_CMD_HEADER header;
    uint8_t drc[4];
    uint8_t result;    // 0-ok, 1-error (already binded?)
    uint8_t mac[6];
    uint8_t reserved[5];
} S_SET_BIND_ECHO;

// 不单独定义配置读取命令，设置命令会返回当前设备参数
typedef struct {
    S_CMD_HEADER header;
    uint8_t dvc[4];
    uint16_t nodeCount;        // 设为0xffff不会修改配置
    uint8_t rgbSeq;            // 设为0xff不会修改配置
    uint8_t protocol;        // 设为0xff不会修改配置
    uint8_t reserved[8];
} S_SET_MARQUEE_CFG_REQ;

typedef struct {
    S_CMD_HEADER header;
    uint8_t dvc[4];
    uint16_t nodeCount;
    uint8_t rgbSeq;
    uint8_t protocol;
    uint8_t reserved[8];
} S_SET_MARQUEE_CFG_ECHO;
 

typedef struct {
    S_CMD_HEADER header;
    uint8_t drc[4];
    uint8_t smid;    // scene_mode_id
    uint8_t rgblum;
    uint8_t red;
    uint8_t green;
    uint8_t blue;
    uint8_t cwlum;
    uint8_t ct;
    uint8_t alarm;    // alarm id 1-5
    uint8_t timer;    // 1-active
    uint8_t reserved[3];
} S_LIGHT_STATUS_NOTIFY;

#pragma mark ============ ios 字节扩展的结构体 ==============

typedef struct {
    S_CMD_HEADER header;
    uint8_t dev_rolling_code[4];
    uint8_t reserved[12];
} S_START_CONNECT_REQ;


typedef struct {
    S_CMD_HEADER header;
    uint8_t dev_rolling_code[4];
    uint8_t reserved[12];
} S_START_CONNECT_ECHO;

#endif /* Header_h */
